package 括号匹配;

import java.util.Scanner;
import java.util.Stack;

public class Brackets {
	public static void main(String[] args) {
		//主函数用于临时测试代码
		Scanner s = new Scanner(System.in);
		Brackets brackets = new Brackets();
		System.out.print("请输入一个包含括号的字符串:");
		System.out.print(brackets.BracktesMatch(s.nextLine()));
		s.close();
	}
	private boolean isMatch(char a ,char b) {
		//判断给定的a 和 b是否是一对配对的括号
		char[][] bra = {
				{'(','[','{'},
				{')',']','}'}
				};
		for(int i = 0; i < bra[0].length; i++) {
			if(bra[0][i] == a && bra[1][i] == b) return true;
		}
		return false;
	}
	public boolean BracktesMatch(String string) {
		Stack<Character> stack = new Stack<>();
		for(int i = 0; i < string.length(); i++) {
			if(String.valueOf(string.charAt(i)).matches("[\\(\\[\\{]")) {
				stack.push(string.charAt(i));
			}else if(String.valueOf(string.charAt(i)).matches("[\\)\\]\\}]")) {
				
				//栈不为空且栈顶的元素和当前扫到的元素是一对配对括号 则弹栈 说明一对括号配对完成
				if( !stack.isEmpty() && isMatch(stack.lastElement(),string.charAt(i))) 
					stack.pop();
				
				//读到右括号时 栈为空 或者栈顶元素与当前扫到的元素不是一对配对括号  说明字符串中的括号配对失败
				else return false;
			}
		}
		
		//最后如果栈为空 说明所有的括号都已经配对完成
		if(stack.isEmpty()) return true;
		return false;
	}
}
